/**
 * WQuake 台湾 P-Alert 插件（示例）
 * ==================================================================
 * 目的：演示 wq.net.fetch 的完整网络能力（含 POST + 自动 Cookie），实现与内建
 *       P-Alert 相近的效果——把台湾 P-Alert 实时测站按 PGA 推送到地图。
 *
 * 数据链：
 *   1) GET  https://palert.earth.sinica.edu.tw/realtime   → 预热，获取 CSRF Cookie
 *      （Cookie 由 C++ 后端共享会话自动存储/回带，插件无需处理 Set-Cookie）
 *   2) POST https://palert.earth.sinica.edu.tw/graphql/    → GraphQL 查询 realtimePGA
 *   3) wq.assets.read('p-alert.csv') → 读取随插件打包的测站坐标表（id→lat/lon/名称）
 *   4) wq.stations.setBatch([...])   → 按 PGA 推站上图（scale:'pga'，配色走 CWA 调色板）
 *
 * 渲染：插件只推「数据」（id/名称/经纬度/PGA，scale:'pga'），不做任何渲染决策。
 *       小圆点 vs 数字大圆点、配色（震度0=灰）、阈值均由 WQ 统一决定，
 *       与内建 NIED/P-Alert/TREM 同款；阈值在 WQ「设置 → 插件测站数字圆点阈值」里调。
 *
 * 网络请求全部经 C++ /api/plugin-fetch 代理（CSRF: X-WQuake-Plugin 头；SSRF: 禁本机/内网），
 * 绕过浏览器 CORS。
 * ==================================================================
 */
(function () {
  var PRIME_URL = 'https://palert.earth.sinica.edu.tw/realtime'
  var GRAPHQL_URL = 'https://palert.earth.sinica.edu.tw/graphql/'
  var QUERY_BODY = '{"query":"query ($recordTime: Float, $type: Int, $token: String) { realtimePGA(recordTime: $recordTime, type: $type, token: $token) { dataVals timestamp } }","variables":{"recordTime":0,"token":"","type":0}}'
  var POST_HEADERS = {
    'Content-Type': 'application/json',
    'Origin': 'https://palert.earth.sinica.edu.tw',
    'Referer': 'https://palert.earth.sinica.edu.tw/realtime'
  }

  var stationMap = {}   // id -> { lat, lon, name }
  var lastVals = null   // 最近一次 dataVals（id -> pga），供设置变更时无需重新联网即可重绘
  var timer = null
  var primed = false
  
  // 读取当前设置（刷新间隔 + 是否显示 PGA；小/大圆点、配色、阈值等渲染决策已全交给 WQ）
  function cfg(wq) {
    var s = (wq.settings && wq.settings.getAll && wq.settings.getAll()) || {}
    return {
      intervalMs: (Number(s.intervalSec) > 0 ? Number(s.intervalSec) : 5) * 1000,
      showPga: (s.showPga !== false)   // 默认开；关闭时面板不显示 PGA 方框
    }
  }

  // 解析测站坐标 CSV（列：id,lat,lon,?,locname,...）
  function parseCsv(text) {
    var lines = String(text || '').split('\n')
    for (var i = 1; i < lines.length; i++) {
      var line = lines[i].trim()
      if (!line) continue
      var p = line.split(',')
      if (p.length >= 5) {
        var lat = parseFloat(p[1])
        var lon = parseFloat(p[2])
        if (!isNaN(lat) && !isNaN(lon)) {
          stationMap[p[0]] = { lat: lat, lon: lon, name: p[4] || p[0] }
        }
      }
    }
  }

  // 把 lastVals 渲染上图：插件只推「数据」（value=PGA(gal) + scale:'pga'），
  // 小圆点/数字圆点、配色、阈值全部由 WQ 根据「插件测站数字圆点阈值」自己决定。
  // pga 字段（面板 PGA 方框）仅在「显示 PGA」开启时携带；关闭则面板不显示 PGA。
  function render(wq) {
    if (!lastVals) return
    var c = cfg(wq)
    var list = []
    var maxPga = 0, maxName = ''
    for (var id in lastVals) {
      if (!Object.prototype.hasOwnProperty.call(lastVals, id)) continue
      var pga = typeof lastVals[id] === 'number' ? lastVals[id] : parseFloat(lastVals[id])
      if (isNaN(pga)) continue
      var st = stationMap[id]
      if (!st) continue
      var item = { id: id, name: st.name, lat: st.lat, lng: st.lon, value: pga, scale: 'pga' }
      if (c.showPga) item.pga = pga   // 只在开关开启时提供 PGA 方框数值
      list.push(item)
      if (pga > maxPga) { maxPga = pga; maxName = st.name }
    }
    wq.stations.setBatch(list, { title: 'P-Alert实时' })
    if (maxPga > 0) {
      wq.log.info('P-Alert 最大 PGA', maxPga.toFixed(2), 'gal @', maxName, '(' + list.length + ' 站)')
    }
  }

  // 预热：拿到 CSRF Cookie（GET /realtime），Cookie 由后端会话自动管理
  function prime(wq) {
    return wq.net.fetch(PRIME_URL)
      .then(function () { primed = true })
      .catch(function () { primed = false })
  }

  // 单轮拉取 + 推站上图
  function tick(wq) {
    var chain = primed ? Promise.resolve() : prime(wq)
    return chain.then(function () {
      return wq.net.fetch(GRAPHQL_URL, { method: 'POST', headers: POST_HEADERS, body: QUERY_BODY })
    }).then(function (res) {
      var json = JSON.parse(res.body)
      var vals = json && json.data && json.data.realtimePGA && json.data.realtimePGA.dataVals
      if (!vals || typeof vals !== 'object') { primed = false; return }  // 可能 Cookie 过期，下轮重新预热
      lastVals = vals
      render(wq)
    }).catch(function (e) {
      primed = false
      wq.log.warn('P-Alert 拉取失败', String(e))
    })
  }

  // 按设置的间隔（重）建定时器
  function restartTimer(wq) {
    if (timer) { clearInterval(timer); timer = null }
    timer = setInterval(function () { tick(wq) }, cfg(wq).intervalMs)
  }

  function onLoad(wq) {
    wq.log.info('P-Alert 示例插件已加载', wq.app.version)
    wq.assets.read('p-alert.csv').then(function (csv) {
      parseCsv(csv)
      wq.log.info('P-Alert 测站坐标表已加载', Object.keys(stationMap).length, '站')
      tick(wq)
      restartTimer(wq)
    }).catch(function (e) {
      wq.log.error('P-Alert 测站坐标表加载失败', String(e))
    })

    // 设置变更：阈值/隐藏/标签立即重绘；间隔变更重建定时器
    if (wq.settings && wq.settings.onChange) {
      wq.settings.onChange(function () {
        render(wq)
        restartTimer(wq)
      })
    }

    wq.onUnload(function () {
      if (timer) { clearInterval(timer); timer = null }
      try { wq.stations.clear() } catch (e) { /* ignore */ }
    })
  }

  if (typeof window !== 'undefined') window.onLoad = onLoad
})();
